/*
Copyright 1995-2015 Esri
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For additional information, contact:
Environmental Systems Research Institute, Inc.
Attn: Contracts Dept
380 New York Street
Redlands, California, USA 92373
email: contracts@esri.com
*/
package com.esri.geoevent.test.performance.ui;
import java.io.File;
import java.net.URL;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.Tooltip;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import com.esri.geoevent.test.performance.jaxb.Report;
import com.esri.geoevent.test.performance.report.AbstractFileRollOverReportWriter;
import com.esri.geoevent.test.performance.report.ReportType;
public class ReportOptionsController implements Initializable {
@FXML
private Label reportTypeLabel;
@FXML
private ComboBox<ReportType> reportType;
@FXML
private Label reportFileLocationLabel;
@FXML
private Label selectedReportFileLocationLabel;
@FXML
private Button reportFileLocationBtn;
@FXML
private Label allCoumnsLabel;
@FXML
private Label selectedCoumnsLabel;
@FXML
private ListView<String> allColumns;
@FXML
private ListView<String> selectedColumns;
@FXML
private Button moveRightBtn;
@FXML
private Button moveLeftBtn;
@FXML
private Button okBtn;
@FXML
private Button cancelBtn;
// statics
private static final String DEFAULT_REPORT_FILE_LOCATION = Paths.get("").toAbsolutePath().toFile() + "/reports";
private static final String DEFAULT_REPORT_FILE_NAME = "report";
private static final ReportType DEFAULT_REPORT_TYPE = ReportType.XLSX;
private static final int DEFAULT_MAX_NUM_OF_REPORT_FILES = 10;
// member vars
private Stage dialogStage;
private Report report;
private boolean okClicked = false;
public ReportOptionsController() {
// set some defaults
report = new Report();
report.setType(DEFAULT_REPORT_TYPE);
report.setMaxNumberOfReportFiles(DEFAULT_MAX_NUM_OF_REPORT_FILES);
report.setReportFile(DEFAULT_REPORT_FILE_LOCATION + "/" + DEFAULT_REPORT_FILE_NAME + "." + report.getType().toString().toLowerCase());
}
@Override
public void initialize(URL location, ResourceBundle resources) {
reportTypeLabel.setText(UIMessages.getMessage("UI_REPORT_TYPE_LABEL"));
reportType.setItems(getReportTypes());
reportType.setValue(report.getType());
reportFileLocationLabel.setText(UIMessages.getMessage("UI_REPORT_FILE_LOCATION_LABEL"));
reportFileLocationBtn.setText(UIMessages.getMessage("UI_REPORT_FILE_BROWSE_LABEL"));
reportFileLocationBtn.setTooltip(new Tooltip(UIMessages.getMessage("UI_REPORT_FILE_BROWSE_DESC")));
allCoumnsLabel.setText(UIMessages.getMessage("UI_ALL_COLUMNS_LABEL"));
selectedCoumnsLabel.setText(UIMessages.getMessage("UI_SELECTED_COLUMNS_LABEL"));
allColumns.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
selectedColumns.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
okBtn.setText(UIMessages.getMessage("UI_OK_BTN_LABEL"));
cancelBtn.setText(UIMessages.getMessage("UI_CANCEL_BTN_LABEL"));
// lookup current directory and add "/report" to it
updateSelectedReportFile(report.getReportFile());
updateSelectedReportColumns(report.getReportColumns());
}
/**
* Sets the stage of this dialog.
*
* @param dialogStage dialogStage
*/
public void setDialogStage(Stage dialogStage) {
this.dialogStage = dialogStage;
}
/**
* Returns true of the user clicked on the ok button
*
* @return <code>true</code> if the user clicked on the "ok" button
* otherwise <code>false</code>.
*/
public boolean isOkClicked() {
return this.okClicked;
}
/**
* Sets the report object to initialize the dialog
*
* @param report {@link Report}
*/
public void setReport(Report report) {
if (report != null) {
this.report = report;
// update report type
if (report.getType() == null) {
report.setType(reportType.getValue());
}
reportType.setValue(report.getType());
// update the report file location
if (StringUtils.isEmpty(report.getReportFile())) {
report.setReportFile(selectedReportFileLocationLabel.getText());
}
updateSelectedReportFile(report.getReportFile());
// update the report columns
HashSet<String> columns = new HashSet<String>();
if (report.getReportColumns() != null) {
columns.addAll(report.getReportColumns());
}
if (report.getAdditionalReportColumns() != null) {
columns.addAll(report.getAdditionalReportColumns());
}
updateSelectedReportColumns(new ArrayList<String>(columns));
}
}
/**
* Returns the report object which is created by this dialog
*
* @return {@link Report}
*/
public Report getReport() {
return this.report;
}
/**
* Toggles the report type and updates the UI state.
*
* @param event {@link ActionEvent} not used
*/
@FXML
public void toggleReportType(final ActionEvent event) {
if (report.getType() != reportType.getValue()) {
report.setType(reportType.getValue());
String newFileName = FilenameUtils.removeExtension(report.getReportFile()) + "." + report.getType().toString().toLowerCase();
updateSelectedReportFile(newFileName);
}
}
/**
* Allows the user to select a report file to used when the reporting is
* done.
*
* @param event {@link ActionEvent} not used.
*/
@FXML
private void chooseReportFile(final ActionEvent event) {
File currentDir = Paths.get("").toAbsolutePath().toFile();
String reportTypeStr = report.getType().toString();
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(UIMessages.getMessage("UI_REPORT_FILE_CHOOSER_TITLE"));
fileChooser.setInitialDirectory(currentDir);
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(reportTypeStr, "*." + reportTypeStr.toLowerCase()));
fileChooser.setInitialFileName(DEFAULT_REPORT_FILE_NAME + "." + reportTypeStr.toLowerCase());
File file = fileChooser.showSaveDialog(dialogStage);
if (file != null) {
updateSelectedReportFile(file.getAbsolutePath());
}
}
@FXML
private void moveRight(final ActionEvent event) {
if (allColumns.getSelectionModel().getSelectedItems() != null) {
List<String> selectedColumnsList = new ArrayList<String>(selectedColumns.getItems());
List<String> columnsToAddList = new ArrayList<String>(allColumns.getSelectionModel().getSelectedItems());
selectedColumnsList.addAll(columnsToAddList);
updateSelectedReportColumns(selectedColumnsList);
}
}
@FXML
private void moveLeft(final ActionEvent event) {
if (selectedColumns.getSelectionModel().getSelectedItems() != null && selectedColumns.getItems().size() > 1) {
List<String> selectedColumnsList = new ArrayList<String>(selectedColumns.getItems());
List<String> columnsToRemoveList = new ArrayList<String>(selectedColumns.getSelectionModel().getSelectedItems());
selectedColumnsList.removeAll(columnsToRemoveList);
updateSelectedReportColumns(selectedColumnsList);
}
}
/**
* handle the "Ok" button being pressed.
*
* @param event ActionEvent
*/
@FXML
private void handleOk(final ActionEvent event) {
if (isInputValid()) {
okClicked = true;
dialogStage.close();
}
}
/**
* handle the "Cancel" button being pressed.
*
* @param event ActionEvent
*/
@FXML
private void handleCancel(final ActionEvent event) {
dialogStage.close();
}
/**
* Validates the user input
*
* @return true if the input is valid
*/
private boolean isInputValid() {
return true;
}
private void updateSelectedReportFile(String fileName) {
if (!StringUtils.isEmpty(fileName)) {
selectedReportFileLocationLabel.setText(fileName);
selectedReportFileLocationLabel.setTooltip(new Tooltip(fileName));
report.setReportFile(fileName);
}
}
private ObservableList<ReportType> getReportTypes() {
ArrayList<ReportType> list = new ArrayList<ReportType>();
list.add(ReportType.XLSX);
list.add(ReportType.CSV);
return FXCollections.observableList(list);
}
private void updateSelectedReportColumns(List<String> selectedColumnsList) {
List<String> currentSelection = selectedColumnsList;
if (currentSelection == null || currentSelection.size() == 0) {
currentSelection = new ArrayList<String>(AbstractFileRollOverReportWriter.getDefaultColumnNames());
}
// remove all items from the all list
List<String> allColumnsList = new ArrayList<String>(AbstractFileRollOverReportWriter.getAllColumnNames());
allColumnsList.removeAll(currentSelection);
allColumns.setItems(FXCollections.observableList(allColumnsList));
// update the selected list
selectedColumns.setItems(FXCollections.observableList(currentSelection));
}
}